package modelo;

public class ConjuntoMatriz {
	
	private int dimension; 
	
	
	public ConjuntoMatriz(int dim){
		
		this.dimension = dim;		
	}
	
	public double obtenerValorEn(int fila, int columna){
		 
		Matriz submatriz = obtenerSubmatriz(fila,columna);
		
		int filaEnSubmatriz = obtenerParametro(fila);
		
		int columnaEnSubmatriz = obtenerParametro(columna);
		
		return submatriz.obtenerValorEn(filaEnSubmatriz,columnaEnSubmatriz);
	}

	public int obtenerParametro(int parametro) {
		
		int auxiliar = this.dimension;
		
		if(parametro > 3){
			
			while(auxiliar >= 3){
				
				if(parametro > auxiliar-3){
					
					if(parametro==auxiliar) return 3;
					
					else if(auxiliar-parametro == 1) return 2;
						
					else return 1;
				}
				
			auxiliar = auxiliar -3;
			}
		}
		return parametro;
	}

	public Matriz obtenerSubmatriz(int fila, int columna) {
		
		if(pertenecaB(fila,columna)){
		
			return new MatrizB();
		
		}else if(perteneceaC(fila,columna)){
		
			return new MatrizC();
		
		}else if(perteneceaD(fila,columna)){
			
			return new MatrizD();
			
		}else if(perteneceaE(fila,columna)){
			
			return new MatrizE();
		
		}else{
			
			return new MatrizNula();
			
		}
	}

	public boolean perteneceaE(int fila, int columna) {
		
		int filaAuxiliar = this.dimension;
				
		int columnaAuxiliar = this.dimension;
		
		while(filaAuxiliar > 3 && columnaAuxiliar > 3){
			
			if((fila > filaAuxiliar-3 && 
				fila <= filaAuxiliar &&
				columna > columnaAuxiliar-6 &&
				columna <= columnaAuxiliar-3)||
				(columna > columnaAuxiliar-3 &&
				columna <= columnaAuxiliar &&
				fila > filaAuxiliar-6 &&
				fila <= filaAuxiliar-3)) {

				return true;
			}
			
		filaAuxiliar = filaAuxiliar -3;
		
		columnaAuxiliar = columnaAuxiliar -3;
		
		}
		return false;
	}

	public boolean perteneceaC(int fila, int columna) {
		
		int filaAuxiliar = this.dimension - 3;
	
		int columnaAuxiliar = this.dimension - 3;
			
		while ( filaAuxiliar > 3 && columnaAuxiliar > 3){

			if (fila <= filaAuxiliar && 
				fila > filaAuxiliar-3 &&
				columna <= columnaAuxiliar &&
				columna > columnaAuxiliar-3)
					
				return true;
				
			filaAuxiliar = filaAuxiliar -3;
				
			columnaAuxiliar = columnaAuxiliar -3;
			
		}
		return false;		
	}

	private boolean pertenecaB(int fila, int columna) {

		if(	fila >= 1 && fila < 4 && columna >= 1 && columna < 4)
			
			return true;
		
		return false;
	}

	private boolean perteneceaD(int fila, int columna) {

		if( fila > this.dimension-3 && fila <= this.dimension && columna > this.dimension-3 && columna <= this.dimension)
			
			return true;
		
		return false;
	}

	public int getDimension(){
		return this.dimension;
	}
}
